const express=require('express');
const config=require('../config');
const common=require('../libs/common');
const fs=require('fs');

let router=express.Router();
module.exports=router;

//进入所以的admin相关的页面之前，
//都要校验用户身份--如果没有登录，则跳转到登录(/admin/login)
router.use((req,res,next)=>{//在这设admin_token，用户的以后可设为token
	//在cookie-parser库中，req有cookies属性，res有cookie属性
	if(!req.cookies['admin_token'] && req.path!='/login'){//用path不会带?后面的
		//没登录，所以转到login页面
		//等待下面操作
		console.log(req.url)//req.url保存你最早想登陆的网址ref
		res.redirect(`/admin/login?ref=${req.url}`);
		//会重定向到login页面，login页面时，会被get渲染，post接收
	}else{
		//当下面的login的post完成登陆后，重定向到根目录时
		//会来到这里
		if(req.path=='/login'){
		//当页面还保存token时,重新登录
		//跑去登录
			next();
		}else{//登录过了,校验token,防止用户伪造token 
		req.db.query(`SELECT * FROM admin_token_table WHERE ID='${req.cookies['admin_token']}'`,(err,data)=>{
			if(err){
				res.sendStatus(500);
			}else if(data.length==0){//伪造的或出问题
				//url和原生一样会在后面带问号
				res.redirect(`/admin/login?ref=${req.url}`);
			}else{//获取ID,登录过的(第二次进入)
				req.admin_ID=data[0]['admin_ID'];
				next();
			}
		})
	}
	}
});

//get:正常把login页面渲染出来就好
router.get('/login',(req,res)=>{
	console.log('GET');
	//创建ref属性,使页面重新回到之前请求的页面
	//当ref为空时，变成undefind,所以要或运算 
	res.render('login',{error_msg:'',ref:req.query['ref']||''});

});

//POST:处理登录相关的请求
router.post('/login',(req,res,next)=>{
	//username和前端的name名相关
	//登录过的，密码肯定保存在req.body里面
	let {username,password}=req.body;

	function setToken(id){
				//回调后，把id返回给cookie,让cookie把数据返回给前台
				let ID=common.uuid();
				let oDate=new Date();
				//20分钟
				oDate.setMinutes(oDate.getMinutes()+20);

				//数据库都是秒要除以1000
				let t=Math.floor(oDate.getTime()/1000);
				//把admin_table的ID映射到admin_token_table的admin_ID里，
				//而admin_token_table的ID则是由uuid生成，顺便返回给前台
				req.db.query(`INSERT INTO admin_token_table (ID , admin_ID,expires) VALUE('${ID}','${id}',${t})`,err=>{
					if(err){
						res.sendStatus(500);
					}else{//把ID传给前台admin_token
						res.cookie('admin_token',ID);

						let ref=req.query['ref'];
						if (!ref) {
							ref='';
						}//登录后,返回前面请求的页面
						//如果是空，则返回上面的根目录
						res.redirect('/admin'+ref);
					}
				})
					}

	//判断两次,第一次为超级管理员，第二为普通管理员
	if(username==config.root_username){
		//匹对在config中保存的密码
		if(common.md5(password)==config.root_password){
			console.log('superRoot');
			setToken(1);

		}else{
			console.log('superRoot login failed');
			showError('用户名或密码有误');
		}
	}else{//验证管理员登录
			req.db.query(`SELECT * FROM admin_table WHERE username='${username}'`,(err,data)=>{
				if(err){
					console.log(err)
					showError('数据库有错');
				}else if(data.length==0){
					showError('用户名或密码有误');
				}else{
					if(data[0].password==common.md5(password)){//password为前台输入的密码
						//把管理员ID返回给cookie，
						//这是建立在数据库已经有了管理员的基础上
						setToken(data[0].ID);
						console.log('普通管理员登录成功');
						
					}else{
						showError('用户名或密码有误');
						
					}
				}
			})
		}

		function showError(msg){//封装--返回错误信息
			//不成功时，返回到login上再次渲染。渲染可以加任何数据
			//重新到页面时，表单提交时，没有保存ref，
			//(可以在前台写上ref,但undefined不好)把ref交给渲染来解决，
			res.render('login',{error_msg:msg,ref:req.query['ref']||''});
		}
})

//在上面已经登录成功(setToken()后)，重定向到这来的根目录
router.get('/',(req,res)=>{
	res.redirect('/admin/house')
});


//获取
router.get('/:table',(req,res)=>{// :table是参数,用来获取后面的地址
	const {table}=req.params;

	if(!config[`show_in_admin_${table}`]){
		//res.sendStatus(404);
		res.showError(404);

	}else{
		
		let aField=[];
		let jsonShowName={};
		config[`show_in_admin_${table}`].split(',').forEach(str=>{
			let [filed,showName]=str.split(':');//[filed,showName]=[title,标题]
			aField.push(filed);
			jsonShowName[filed]=showName;//{'title':标题},把showName放入里面
		})
	

	//分页
	const size=2;//一页中显示数据条数
	let page=req.query.page;//page为当前页

	if(!page){//判断客户伪造
		page=1;
	}else if(!/^[1-9]\d*$/.test(page)){
		page=1;
	}
	//起点：第n页:(n-1)*size
	let start=(page-1)*size;

	//搜索
	let like_seg='1=1';//任何东西=任何东西,避免空
	if (req.query.keyword) {//有搜索东西时才进行
		let keys=req.query.keyword.split(/\s+/g);
		//['a','b']=>["%a%",%b%]  mysql语句 LIKE%=*
		like_seg= keys.map(item=>` title LIKE '%${item}%'`).join(' OR ');
	}
	

	//获取数据,LIMIT：限制之意,限制呈现出来的数据数量
	//DESC:降序,ASC:升序，ORDER：以create_time的为排序
	req.db.query(`SELECT ${aField.join(',')} FROM ${table}_table WHERE ${like_seg} ORDER BY create_time DESC LIMIT ${start},${size}`,(err,result)=>{
		if(err){
			res.showError(500);
			//res.sendStatus(500)
		}else{
			//2.COUNT为获取总数据量 AS是赋予c别名
			req.db.query(`SELECT COUNT(*) AS c FROM ${table}_table  WHERE ${like_seg}`,(err,data)=>{
				if(err){
					res.showError(500);
					//res.sendStatus(500);
				}else if(data.length==0){
					res.showError(500);
					//res.sendStatus(500);
				}else{//总页数除以每页显示数量,向上取整
					res.render('index',{
						data:result,
						show_page_count:9,//显示多少页数
						cur_page:parseInt(page),//当前页
						page_count:Math.ceil(data[0].c/size),//总页数
						keyword:req.query.keyword,//返回给前台的keyword(搜索关键字)
						jsonShowName,//返回的是标题等json数据
						table,//当点击编辑时，把请求的table返回给ajax
					});
				}

				
			})
			
		}
	})
	}
	});

//添加 || 修改
router.post('/:table',(req,res)=>{
	const {table}=req.params;

	if(req.body['is_mod']=='true'){//设置is_mod判断是否为修改或添加
		if(!config[`insert_field_${table}`]){
			res.showError(404);
			//res.sendStatus(404);
	}else{

		let fields=config[`insert_field_${table}`].split(',');
		config[`disallow_modify_fields`].split(',').forEach(name=>{
			//设置一些用户不能修改的配置，filter：当符合则保存
			fields=fields.filter(item=>item!=name);
		})

		let arr=[];

		fields.forEach(key=>{
			 arr.push(`${key}='${req.body[key]}'`);
		})
		
		let sql=`UPDATE ${table}_table SET ${arr.join(',')} WHERE ID='${req.body['old_id']}'`;
		req.db.query(sql,err=>{
			if(err){
				res.sendStatus(404,'no this data');
				console.log(err)
			}else {
				res.redirect(`/admin/${table}`)
			}
			})
			}
		}else{//添加
		//获取前台的信息

		const file_info=config[`${table}`];//house,ad,broker
		const file_paths={};//存放路径
		const file_real_paths={};


		for(let i=0;i<req.files.length;i++){
			//fieldname为字段名,如main_img,与前台的name相对应
			req.name=req.files[i].fieldname;
			let name=req.name;
			if(file_info[name]){
			//file_info[name]=house.img之类取属性值
				if(!file_paths[name]){
				//当文件为空时，设为空数组，避免undefined
					file_paths[name]=[];
					file_real_paths[name]=[];
				}
				//filename为文件名
				file_paths[name].push(req.files[i].filename);
				file_real_paths[name].push(req.files[i].path.replace(/\\/g,'\\\\'));
			}
			}

		for(let name in file_paths){
			if(file_info[name].type=='single'){
				req.body[file_info[name].path]=file_paths[name][0];
				req.body[file_info[name].real_path]=file_real_paths[name][0];
			}else{//寻找config里的main_img里的属性值
				req.body[file_info[name].path]=file_paths[name].join(',');
				req.body[file_info[name].real_path]=file_real_paths[name].join(',');
			}
			}

		//只存文件名
		let aImgPath=[];
		let aImgRealPath=[];

		req.body['ID']=common.uuid();
		req.body['admin_ID']=req.admin_ID;


		//console.log(req.body);
		let arrField=[];
		let arrValue=[];

		config[`insert_field_${table}`].split(',').forEach(name=>{
			if(name!='admin_ID'){
			arrField.push(name);
			arrValue.push(req.body[name]);}
			});

		arrField.push('create_time','admin_ID');
		arrValue.push(Math.floor(new Date().getTime()/1000),req.admin_ID);
		let sql=`INSERT INTO ${table}_table (${arrField.join(',')}) VALUE('${arrValue.join("','")}')`;
		req.db.query(sql,err=>{
			if(err){
				console.log(err)
				res.showError(500);
				//res.sendStatus(500);
			}else{
				res.redirect(`/admin/${table}`);
				//重定向到house，变成get，到get中的显示数据部分
			}
		})
	}
	
	})

//删除
router.get('/:table/delete',(req,res)=>{
	let {table}=req.params;
	let ID=req.query['id'];
	let aID=ID.split(',');
	let b_err=false;
	aID.forEach(item=>{//防伪造
		if(!/^(\d|[a-f]){32}$/.test(item)){
			b_err=true;
		}
	});
	if(b_err){
		res.showError(404);
		//res.sendStatus(400);
	}else{
		let id_index=0;
		_next();
		function _next(){
			let ID=aID[id_index++];

			//1.删除关联的图片
		req.db.query(`SELECT * FROM ${table}_table WHERE ID='${ID}'`,(err,data)=>{
			if(err){
				res.showError(500);
				//res.sendStatus(500);
			}else if(data.length==0){
				res.sendStatus(404,'no this data');
			}else{
				let arr=[];//存删除的文件
				const file_info=config[`${table}`];
				for(name in file_info){//删除文件

					let names=file_info[name].real_path;
						if(names=='img_real_paths'){
							if(names){
								data[0][names].split(',').forEach(item=>{
									arr.push(item)
								});
									}
								}else{
									data[0][names]&&arr.push(data[0][names]);
								}
					}

				function deleteFromDB(){
								//1.删除完了
								//2.删除数据本身
								req.db.query(`DELETE FROM ${table}_table WHERE ID='${ID}'`,err=>{
									if(err){
										res.showError(500);
										//res.sendStatus(500);
										console.log('adsfsa')
									}else{
									//重定向house页面，使更新后的后台数据再次前台
										//res.redirect('/admin/house');
										if (id_index<aID.length) {
											_next();
											}else{//删完了,回原来的页面
												res.redirect(`/admin/${table}`);
											}
									}
								})
				}

				//删除文件
				if(arr.length>0){
					//for
				let i=0;

				next();
				function next(){//函数在里面添加
					fs.unlink(arr[i],err=>{
						if(err){
							console.log(arr);
							res.showError(500);

							//res.sendStatus(500);
						}else{
							i++;
							if(i>=arr.length){
								deleteFromDB();
							}else{
							next();
						}
						}
					})
					}
					
				}else{//没有文件可删时
					deleteFromDB();
				}
				

			}
		})
		}
	}
	})

//接口
router.get('/:table/get_data',(req,res)=>{
	const {table}=req.params;
	const id=req.query.id;

	if(!id){
		res.showError(404);
		//res.sendStatus(404);
	}else if(!/^[\da-f]{32}$/.test(id)){
		res.showError(404);
		//res.sendStatus(400)
	}else{
		req.db.query(`SELECT * FROM ${table}_table WHERE ID = '${id}'`,(err,data)=>{
			if(err){
				res.sendStatus(400);
			}else if(data.length==0){
				res.sendStatus(404);
			}else{
				res.send(data[0]);//返回数据给ajax中的json
			}
		})
	}
});









